package com.zx._15_应用.短链;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Test;

public class 短UUID {

    // 36 + 26 = 62 位
    final static char[] digits = {
            '0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b',
            'c', 'd', 'e', 'f', 'g', 'h',
            'i', 'j', 'k', 'l', 'm', 'n',
            'o', 'p', 'q', 'r', 's', 't',
            'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B',
            'C', 'D', 'E', 'F', 'G', 'H',
            'I', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T',
            'U', 'V', 'W', 'X', 'Y', 'Z'
    };

    public static void main(String[] args) {
        System.out.println(shortStr());
    }

    public static String shortStr() {
        // 已知，uuid是32个16进制的数字串联起来的
        String uuid = UUID.randomUUID().toString();
        String uuidStr = uuid.replace("-", "");
        StringBuffer shortBuffer = new StringBuffer();
        for (int i = 0; i < 8; i++) {
            // 获得连续4个16进制的数字
            String str = uuidStr.substring(i * 4, i * 4 + 4);
            // 将16进制转为10进制
            int x = Integer.parseInt(str, 16);
            // 使用62取模
            shortBuffer.append(digits[x % 0x3E]);
        }
        return shortBuffer.toString();
    }

    @Test
    public void test1() {
        Map<String, List<String>> shortMap = Stream.iterate(1, i -> i++)
                .limit(Integer.MAX_VALUE)
                .map(x -> shortStr())
                .collect(Collectors.groupingBy(x -> x.toString()));

        List<String> collect = shortMap.keySet()
                .parallelStream()
                .filter(key -> shortMap.get(key).size() > 1)
                .collect(Collectors.toList());

        collect.stream().forEach(System.out::println);


    }

}
